/* psit_types.h deve definir os tipos usados pelo pacote para gerenciar
 * as informações de cada thread, mutex e variável de condição. Este
 * arquivo deve ser completado pelo implementador.
 */

#ifndef _PSIT_TYPES_H_
#define _PSIT_TYPES_H_

#include <ucontext.h>
#include <stdio.h>
#include <stdlib.h>


#include "list.h"
/**
 * Implementação  para thread
 */
//TODO poderia ser melhor essa implementação da estrutura thread e não colocar tantos dados a mostra ...
typedef struct thread {
	/**
	 * Identificador unico para a thread
	 */
	int thread_id;
	/**
	 * se está esperando liberação de algum semaforo
	 * Usado pelo comparator das threads para gerar
	 * a prioridade
	 */
	int isWaiting;
	/**
	 * Se a thread cedeu a sua vez
	 * Usado pelo comparator das threads para gerar
	 * a prioridade
	 */
	int yielded;
	//Pilha da Thread
	char *stack;
	/**
	 *Contexto da thread
	 */
	ucontext_t *context;
	/**
	 * define que a thread morreu 1 morta, 0 viva
	 */
	int is_dead;
	/**
	 * Função que realiza o trabalho da thread
	 */
	void *runnable;

} thread_t;
/**
 * Implelementacao de semaforo
 */
typedef struct sem {
	/**
	 * Identificador único
	 */
	int sem_id;
	/**
	 * Quantidade de elementos disponiveis para uso na trava.
	 */
	int quant;
	/**
	 * Quantidade de elementos disponiveis para uso na espera.
	 */
	List *list_thread_waiting;
} sem_t;


#endif /* _PSIT_TYPES_H_ */
